package com.binhthuan.catechist.server.domain;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

import com.google.gson.annotations.Expose;

/**
 * @author Giang Đinh - Thông tin về học viên, tương ứng với bảng
 *         <b>ec_trainee</b> trong cơ sở dữ liệu.
 */
@Entity
@Table(name="ec_trainee")
@PrimaryKeyJoinColumn(name="person_id")
public class Trainee extends Person {

    /**
     * Ngày rửa tội.
     */
    @Column(name = "baptism_date")
    @Expose
    private Date baptismDate;
    
    /**
     * Nơi rửa tội.
     */
    @Column(name = "baptism_place", length = 100)
    @Expose
    private String baptismPlace;
    
    /**
     * Ngày rước lễ lần đầu.
     */
    @Column(name = "first_communion_date")
    @Expose
    private Date firstCommunionDate;
    
    /**
     * Nơi rước lễ lần đầu.
     */
    @Column(name = "first_communion_place", length = 100)
    @Expose
    private String firstCommunionPlace;
    
    /**
     * Ngày thêm sức.
     */
    @Column(name = "confirmation_date")
    @Expose
    private Date confirmationDate;
    
    /**
     * Nơi thêm sức.
     */
    @Column(name = "confirmation_place")
    @Expose
    private String confirmationPlace;
    
    /**
     * Cha.
     */
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "father_id")
    @Expose
    private Parent father;
    
    /**
     * Mẹ.
     */
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "mother_id")
    @Expose
    private Parent mother;
    
    /**
     * Người đỡ đầu.
     */
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "sponsor_id")
    @Expose
    private Parent sponsor;
    
    /**
     * Tình trạng của học viên.
     */
    @ManyToOne
    @JoinColumn(name = "trainee_status_id")
    @Expose
    private TraineeStatus status;
    
    /**
     * Lớp hiện tại.
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "current_course_id")
    @Expose
    private Course currentCourse;
    
    /**
     * Các lớp đã học.
     */
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "trainees", fetch = FetchType.LAZY)
    private Set<Course> courses;
    
    /**
     * Ghi chú.
     */
    @Column(name="comment", length=255)
    @Expose
    private String comment;

    public Trainee() {
        courses = new HashSet<Course>(0);
    }
    
    /**
     * Lấy ngày rửa tội.
     * @return Ngày rửa tội.
     */
    public Date getBaptismDate() {
        return baptismDate;
    }

    /**
     * Gán ngày rửa tội.
     * @param baptismDate
     *            Ngày rửa tội.
     */
    public void setBaptismDate(Date baptismDate) {
        this.baptismDate = baptismDate;
    }

    /**
     * Lấy nơi rửa tội.
     * @return Nơi rửa tội.
     */
    public String getBaptismPlace() {
        return baptismPlace;
    }

    /**
     * Gán nơi rửa tội.
     * @param baptismPlace
     *            Nơi rửa tội.
     */
    public void setBaptismPlace(String baptismPlace) {
        this.baptismPlace = baptismPlace;
    }

    /**
     * Lấy ngày rước lễ lần đầu.
     * @return Ngày rước lễ lần đầu.
     */
    public Date getFirstCommunionDate() {
        return firstCommunionDate;
    }

    /**
     * Gán ngày rước lễ lần đầu.
     * @param firstCommunionDate
     *            Ngày rước lễ lần đầu.
     */
    public void setFirstCommunionDate(Date firstCommunionDate) {
        this.firstCommunionDate = firstCommunionDate;
    }

    /**
     * Lấy nơi rước lễ lần đầu.
     * @return nơi rước lễ lần đầu.
     */
    public String getFirstCommunionPlace() {
        return firstCommunionPlace;
    }

    /**
     * Gán nơi rước lễ lần đầu.
     * @param firstCommunionPlace
     *            Nơi rước lễ lần đầu.
     */
    public void setFirstCommunionPlace(String firstCommunionPlace) {
        this.firstCommunionPlace = firstCommunionPlace;
    }

    /**
     * Lấy ngày thêm sức.
     * @return Ngày thêm sức.
     */
    public Date getConfirmationDate() {
        return confirmationDate;
    }

    /**
     * Gán ngày thêm sức.
     * @param confirmationDate
     *            Ngày thêm sức.
     */
    public void setConfirmationDate(Date confirmationDate) {
        this.confirmationDate = confirmationDate;
    }

    /**
     * Lấy nơi thêm sức.
     * @return Nơi thêm sức.
     */
    public String getConfirmationPlace() {
        return confirmationPlace;
    }

    /**
     * Gán nơi thêm sức.
     * @param confirmationPlace
     *            Nơi thêm sức.
     */
    public void setConfirmationPlace(String confirmationPlace) {
        this.confirmationPlace = confirmationPlace;
    }

    /**
     * Lấy thông tin cha.
     * @return Thông tin cha..
     */
    public Parent getFather() {
        return father;
    }

    /**
     * Gán thông tin cha.
     * @param father
     *            Thông tin cha.
     */
    public void setFather(Parent father) {
        this.father = father;
    }

    /**
     * Lấy thông tin mẹ.
     * @return Thông tin mẹ.
     */
    public Parent getMother() {
        return mother;
    }

    /**
     * Gán thông tin mẹ.
     * @param mother
     *            Thông tin mẹ.
     */
    public void setMother(Parent mother) {
        this.mother = mother;
    }

    /**
     * Lấy thông tin người đỡ đầu.
     * @return Thông tin người đỡ đầu.
     */
    public Parent getSponsor() {
        return sponsor;
    }

    /**
     * Gán thông tin người đỡ đầu.
     * @param sponsor
     *            Thông tin người đỡ đầu.
     */
    public void setSponsor(Parent sponsor) {
        this.sponsor = sponsor;
    }

    /**
     * Lấy tình trạng hiện tại.
     * @return Tình trạng hiện tại.
     */
    public TraineeStatus getStatus() {
        return status;
    }

    /**
     * Gán tình trạng hiện tại.
     * @param status
     *            Tình trạng hiện tại.
     */
    public void setStatus(TraineeStatus status) {
        this.status = status;
    }

    /**
     * Lấy lớp học hiện tại.
     * @return Lớp học hiện tại.
     */
    public Course getCurrentCourse() {
        return currentCourse;
    }

    /**
     * Gán lớp học hiện tại.
     * @param course
     *            Lớp học hiện tại.
     */
    public void setCurrentCourse(Course course) {
        this.currentCourse = course;
    }

    /**
     * Lấy các lớp đã học.
     * @return Các lớp đã học.
     */
    public Set<Course> getCourses() {
        return courses;
    }

    /**
     * Gán các lớp đã học.
     * @param courses
     *            Các lớp đã học.
     */
    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }

    /**
     * @return the comment
     */
    public String getComment() {
        return comment;
    }

    /**
     * @param comment the comment to set
     */
    public void setComment(String comment) {
        this.comment = comment;
    }
}
